excel 是很多人常用來處理報表與數據的工具,同樣地在 python 也有一個套件常常在處理這件事,就是我們今天的主角 Pandas。這個工具是很多人在做 python 資料分析的探索工具,有必要好好地學習熊貓!
pandas 為第三方套件庫,記得先安裝後,通常還會安裝相依的套件庫 numpy
pip install numpy
pip install pandas
numpy 和 pandas 均需要導入;大部分人習慣縮寫用 np 和 pd
import numpy as np
import pandas as pd
類似 list 的資料結構,可以自訂索引,是一個有索引值的一維陣列
s1 = pd.Series([0, 1, 2])
s1
s2 = pd.Series([0, 1, 2], index=[2, 7, 9])
s2
有屬性 values 和 index,可以使用
類似 excel 的資料結構,一樣有索引值,是有索引值的二維陣列。由於大家處理的資料大部分會是二維陣列,我會著重介紹 DataFrame 的操作。
可以使用 csv、excel等等,每個方法可能有不同的默認值,使用者根據不同資料的格式進行參數調整。
df1 = pd.read_csv('file_path', header=1)
df2 = pd.read_excel('file_path', header=1)
當然也可以自己創建資料,會與 dict 搭配使用。 Dataframe 的格式就像 excel 一樣有行有列。
df1 = pd.DataFrame({"id": [0, 1, 2],
"student": ["Erik", "David", "Mary"],
"score": [85, 100, 70]})
df1
拿到一個資料的時候,應該要先查看資料的實際狀況
# 不輸入數字預設查看5筆
df.head()
df.head(100)
df.tail()
# 顯示全部,但有時候會因為資料太多而被 pandas 用 ... 表示
df
後面的 None 是表示顯示全部,也可以更改為正整數
詳細請參考
pd.set_option('display.max_columns', None)
pd.set_option("max_colwidth", None)
pd.set_option("max_rows", None)
可以得知該資料表的整理資訊,包含 not-null、資料維度、格式和所佔空間等等
df.info()
這邊要順便提醒 excel 轉 pandas 時,有些資料格式的轉換如果不是非預期,可能造成資料處理錯誤。因此需要先看看所有的欄位是不是有問題哦!
寫欄位的時候可以用中括號或是一點再加上名稱,但提醒一點加上名稱的方法可能會因為 df 有其他保留關鍵字而無法使用成功,中文也是不能用一點加上名稱。以下 dtypes 就是剛好 df 也有這個屬性會跟 df 本身的欄位可能會打架。
# 回傳 df 的 dtypes 欄位
df['dtypes']
# 回傳 df 的 dtypes 屬性
df.dtypes
# 回傳 df 的 名稱 欄位
df['名稱']
# 不能使用
df.名稱
呼叫欄位名稱之後,通常會在轉成 list 以方便進行之後的操作
df.columns.tolist()
key 值是舊名稱;value 值是新名稱
df.rename(columns={"Age": "new_age"})
若要使用其中一個數據,可以搭配索引值,例如我想知道資料筆數就可以 df.shape[0],當然也可以直接用 len(df)
df.shape
>>> (891, 12)
如果有調整順序,通常會再重設索引值,避免之後迴圈順序有錯等等
df.reset_index(inplace=True)
loc 前面是索引值,後面會接明確的文字
df.loc[0 ,'Age']
iloc 前後都會接索引值
df.iloc[0, 7]
資料表會回傳每個數據是否為空值的布林值(另外也可以用 notnull() )
df.isnull()
或是檢查特定欄位
df['Age'].isnull()
加總用法
df['Age'].isnull().sum()
查看空值的方法
df[df['Age'].isnull()]
只要那一行有空值就會被踢掉
df.drop(how='any')
填充空值的方法,fillna 裡面放 Age 的平均值
value = df.Age.mean()
df.Age.fillna(value)
刪除重複值,默認是保留第一筆看到的資料
df.Age.drop_duplicates()
df.Sex.value_counts()
可以簡單的全部加上某個數值
df['Age'] = df['Age'] + 1
替換方法
df['Sex'] = df['Sex'].replace('male', 'M')
使用 lambda 匿名函數達到更換的功效
df['Sex'] = df['Sex'].apply(lambda x: 'M' if x == 'male' else 'F')
也可以寫一個 function
def age_group(age):
if age <= 20:
return '20歲以下'
elif age>=21 and age <=40 :
return '21歲-40歲'
elif age>=41 and age <=60 :
return '41歲-60歲'
elif age>=61 and age <=80 :
return '61歲-80歲'
elif age>=81 and age <=100 :
return '81歲-100歲'
elif age >=101:
return '101歲以上'
else:
return 'error'
df['Age_Group'] = df.apply(lambda x: age_group(x['Age']), axis=1)
迴圈操作,但基本上會比 apply 慢
for index, row in df.iterrows():
if row['Sex'] == 'male':
df.loc[index, 'Sex'] = 'M'
else:
df.loc[index, 'Sex'] = 'F'
ascending 默認值為 False,會採取升冪方式排序
df.sort_values(by=['Age'], ascending=False)
df[] 裡面可以放條件,讓 dataframe 去找尋合適的條件,另外後面可以選擇欄位(需要兩個中括號)
df[df['Age'] > 30][['Age', 'Survived']]
用 and
df[(df['Age'] > 30) & (df['Embarked']=='S')]
用 or
df[(df['Age'] > 30) | (df['Embarked']=='S')]
也可以用 isin 篩選
df[df['Embarked'].isin(['S', 'C'])]